<?php
/**
 * Classe modelo da tabela Pessoa
 * @filesource
 * @author			Diogo Corazolla
 * @copyright		Copyright 2009 M2R
 * @package			broffices
 * @subpackage		broffices.application.models
 * @version			1.0
*/
class Pessoa extends Zend_Db_Table_Abstract
{
	protected $_name = "tbl_pessoa";
	protected $_dependentTables = array("Fisica",
										"Juridica",
										"Contato",
										"Endereco",
										"Cliente");
	protected $_referenceMap = array(
		'Fisica' => array(
			'columns' => 'pessoa_id',
			'refTableClass' => 'Fisica',
			'refColumns' => 'id'
		),
		'Juridica' => array(
			'columns' => 'pessoa_id',
			'refTableClass' => 'Juridica',
			'refColumns' => 'id'
		)
	);
	
	/**
	 * Retorna registros do banco de dados
	 * @param array $where - array com dados where no formato "nome_coluna_1"=>"valor_1","nome_coluna_2"=>"valor_2"
	 * @param array $order - array com orders no formado "coluna_1 desc","coluna_2"...
	 * @param int $tamanho - numero de registros que deve retornar
	 * @param int $inicio - offset
	 * @return Zend_Db_Table_Rowset_Abstract
	 */
	public function busca($where=array(), $order=array(), $tamanho=-1, $inicio=-1)
	{
		// criando objeto do tipo select
		$slctUnidade = $this->select();
		
		$slctUnidade->setIntegrityCheck(false);
		
		$slctUnidade->from(array("p"=>"tbl_pessoa"));
					
		$slctUnidade->joinLeft(array("f"=>"tbl_fisica"),
								"f.pessoa_id = p.id");					
		
		$slctUnidade->joinLeft(array("j"=>"tbl_juridica"),
								"j.pessoa_id = p.id");
							
							
		// adicionando clausulas where
		foreach ($where as $coluna=>$valor)
		{
			$slctUnidade->where($coluna." ?", $valor);
		}

		// adicionando linha order ao select
		$slctUnidade->order($order);

		// paginacao 
		if ($tamanho > -1)
		{
			$tmpInicio = 0;
			if ($inicio > -1) 
			{
				$tmpInicio = $inicio;
			}
			$slctUnidade->limit($tamanho, $tmpInicio);
		}
		
		// retornando os registros conforme objeto select
		return $this->fetchAll($slctUnidade);
	}
	
	public function buscaFisica($where=array(), $order=array(), $tamanho=-1, $inicio=-1)
	{
		// criando objeto do tipo select
		$slct = $this->select();
		
		$slct->setIntegrityCheck(false);
		
		$slct->from(array("p"=>"tbl_pessoa"), 
					array("id"=>"p.id",
							"vhr_nome"=>"p.vhr_nome"));
					
		$slct->joinInner(array("f"=>"tbl_fisica"),
							"f.pessoa_id = p.id",
							array(
								"pessoa_id"=> "f.pessoa_id",
								"dte_nascimento"=>"DATE_FORMAT(f.dte_nascimento, '%d/%m/%Y')",
								"vhr_cpf"=>"f.vhr_cpf",
								"vhr_rg"=>"f.vhr_rg",
								"vhr_rgorgaouf"=>"f.vhr_rgorgaouf"));
		
		// adicionando clausulas where
		foreach ($where as $coluna=>$valor)
		{
			$slct->where($coluna." ?", $valor);
		}

		// adicionando linha order ao select
		$slct->order($order);

		// paginacao 
		if ($tamanho > -1)
		{
			$tmpInicio = 0;
			if ($inicio > -1) 
			{
				$tmpInicio = $inicio;
			}
			$slct->limit($tamanho, $tmpInicio);
		}
		
		// retornando os registros conforme objeto select
		return $this->fetchAll($slct);
	}
	
	//BUSCA CLIENTE PESSOA JURIDICA
	public function buscaJuridica($where=array(), $order=array(), $tamanho=-1, $inicio=-1)
	{
		// criando objeto do tipo select
		$slct = $this->select();
		
		$slct->setIntegrityCheck(false);
		
		$slct->from(array("p"=>"tbl_pessoa"), 
					array("id"=>"p.id",
							"vhr_nome"=>"p.vhr_nome"));
										
		$slct->joinInner(array("j"=>"tbl_juridica"),
							   "j.pessoa_id = p.id",
							array("pessoa_id"=> "j.pessoa_id",
								  "responsavel_id"=>"j.responsavel_id",
								  "atividadeempresarial_id"=>"j.atividadeempresarial_id",
								  "vhr_cnpj"=>"j.vhr_cnpj",
								  "vhr_razao_social"=>"j.vhr_razao_social",
								  "vhr_inscricao_estadual"=>"j.vhr_inscricao_estadual"));
							
		$slct->joinInner(array("p2"=>"tbl_pessoa"), 
							   "p2.id = j.responsavel_id",
							array("vhr_nomeresponsavel"=>"p2.vhr_nome"));
								  
		$slct->joinLeft(array("f"=>"tbl_fisica"), 
									"f.pessoa_id = j.responsavel_id", 
									array("vhr_cpf"=>"f.vhr_cpf"));
		
		// adicionando clausulas where
		foreach ($where as $coluna=>$valor)
		{
			$slct->where($coluna." ?", $valor);
		}

		// adicionando linha order ao select
		$slct->order($order);

		// paginacao 
		if ($tamanho > -1)
		{
			$tmpInicio = 0;
			if ($inicio > -1) 
			{
				$tmpInicio = $inicio;
			}
			$slct->limit($tamanho, $tmpInicio);
		}
		
		// retornando os registros conforme objeto select
		return $this->fetchAll($slct);
	}
	
	/**
	 * apaga um registro da tabela
	 * @param int $codigo - codigo do registro para apagar
	 * @return void
	 */
	public function apaga($codigo)
	{
		//$where = $this->getAdapter()->quoteInto('id = ?', $codigo);
		//$this->delete($where);
	}
	
	public function apagaCliente($codigo)
	{
		$row = $this->find($codigo)->current();
		$row->bln_ativo = 0;
		$row->save();
		//$where = $this->getAdapter()->quoteInto('id = ?', $codigo);
		//$this->delete($where);
	}
	
	/**
	 * retorna total de registros do banco
	 * @param array $where - array com dados where no formato "nome_coluna_1"=>"valor_1","nome_coluna_2"=>"valor_2"
	 * @return int
	 */
	public function pegaTotal($where=array())
	{
		$slctUnidade = $this->select();
		
		$slctUnidade->from($this, array("COUNT(id) as total"));
		
		foreach ($where as $coluna=>$valor)
		{
			$slctUnidade->where($coluna." ?", $valor);
		}
		
		$rows = $this->fetchAll($slctUnidade);
		
		return $rows->current()->total;
	}
	
	public function pegaTotalFisica($where=array())
	{
		$slct = $this->select();
		
		$slct->setIntegrityCheck(false);
		
		$slct->from(array("p"=>"tbl_pessoa"), 
					array("total"=>"COUNT(p.id)"));
					
		$slct->joinInner(array("f"=>"tbl_fisica"),
							"f.pessoa_id = p.id",
							array(
								"pessoa_id"=> "f.pessoa_id",
								"dte_nascimento"=>"DATE_FORMAT(f.dte_nascimento, '%d/%m/%Y')",
								"vhr_cpf"=>"f.vhr_cpf",
								"vhr_rg"=>"f.vhr_rg",
								"vhr_rgorgaouf"=>"f.vhr_rgorgaouf"));							
		
		foreach ($where as $coluna=>$valor)
		{
			$slct->where($coluna." ?", $valor);
		}
		//xd($slct);
		$rows = $this->fetchAll($slct);
		
		return $rows->current()->total;
	}
	
	//PEGA NUMERO TOTAL DE PESSOAS JURIDICAS CLIENTES
	public function pegaTotalJuridica($where=array())
	{
		$slct = $this->select();
		
		$slct->setIntegrityCheck(false);
		
		$slct->from(array("p"=>"tbl_pessoa"), 
					array("total"=>"COUNT(p.id)"));
					
		$slct->joinInner(array("j"=>"tbl_juridica"),
							   "j.pessoa_id = p.id",
							array("pessoa_id"=> "j.pessoa_id",
								  "responsavel_id"=>"j.responsavel_id",
								  "atividadeempresarial_id"=>"j.atividadeempresarial_id",
								  "vhr_cnpj"=>"j.vhr_cnpj",
								  "vhr_razao_social"=>"j.vhr_razao_social",
								  "vhr_inscricao_estadual"=>"j.vhr_inscricao_estadual"));
							
		$slct->joinInner(array("p2"=>"tbl_pessoa"), 
							   "p2.id = j.responsavel_id",
							array("vhr_nomeresponsavel"=>"p2.vhr_nome"));
								  
		$slct->joinLeft(array("f"=>"tbl_fisica"), 
									"f.pessoa_id = j.responsavel_id", 
									array("vhr_cpf"=>"f.vhr_cpf"));									
		
		foreach ($where as $coluna=>$valor)
		{
			$slct->where($coluna." ?", $valor);
		}
		
		$rows = $this->fetchAll($slct);
		
		return $rows->current()->total;
	}
}
